package com.vo;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Calendar;

/**
 * Classe Interval utilizada para definir duração dos eventos(Event) e verificar
 * possíveis conflitos de horário.
 * @author Jean Vasconcelos, Carla Sukeyosi, Matheus Emanuel, Heitor Carvalho
 */
public class Interval implements Serializable
{
    private Calendar startCalendar;
    private Calendar endCalendar;

    /**
     * Cria um novo Intervalo, um Calendar para o início e outro para o fim. 
     */
    public Interval()
    {
        this.startCalendar = Calendar.getInstance();
        this.endCalendar = Calendar.getInstance();
    }
    
    /**
     * Modifica o Calendar do início do Intervalo.
     * @param Novo Calendar do início.
     */
    public void setStartCalendar(Calendar startCalendar)
    {
        this.startCalendar = startCalendar;
    }
    
    /**
     * Modifica o Calendar do início do Intervalo.
     * @param year Novo ano.
     * @param month Novo mês.
     * @param date Novo dia.
     * @param hourOfDay Nova hora.
     * @param minute Novo minuto.
     */
    public void setStartCalendar(int year, int month, int date, int hourOfDay, int minute)
    {
        this.startCalendar.set(year, month, date, hourOfDay, minute);
    }
    
    /**
     * Modifica o Calendar do fim do Intervalo.
     * @param Novo Calendar do fim.
     */
    public void setEndCalendar(Calendar endCalendar)
    {
        this.endCalendar = endCalendar;
    }
    
    /**
     * Modifica o Calendar do fim do Intervalo.
     * @param year Novo ano.
     * @param month Novo mês.
     * @param date Novo dia.
     * @param hourOfDay Nova hora.
     * @param minute Novo minuto.
     */
    public void setEndCalendar(int year, int month, int date, int hourOfDay, int minute)
    {
        this.endCalendar.set(year, month, date, hourOfDay, minute);
    }
    
    /**
     * Recupera o Calendar do fim do Intervalo. 
     * @return Calendar do fim do Intervalo.
     */
    public Calendar getEndCalendar()
    {
        return endCalendar;
    }

    /**
     * Recupera o Calendar do início do Intervalo.
     * @return Calendar do início do Intervalo.
     */
    public Calendar getStartCalendar()
    {
        return startCalendar;
    }

    /**
     * Verifica se há connflito entre Intervalos. Comparando os Calendar de início
     * e de fim.
     * @param otherInterval Intervalo a ser comparado
     * @return true se há conflito entre os Intervalos
     */
    public boolean isConflicted (Interval otherInterval)
    {
        /*Verifica qual evento acontece primeiro
        Se a hora final do evento que acontece primeiro
        for maior que a hora inicial do que acontece depois,
        entao ha conflito de horarios.*/
        
        if (otherInterval.getStartCalendar().before(startCalendar))
        {
            return otherInterval.getEndCalendar().getTime().getTime() > startCalendar.getTime().getTime();
        } 
        else if (startCalendar.before(otherInterval.getStartCalendar()))
        {
            return endCalendar.getTime().getTime() > otherInterval.getStartCalendar().getTime().getTime();
        }
        
        return true;
    }

    /**
     * Informações do Intervalo num String.
     * @return String com as informações do Intervalo.
     */
    @Override
    public String toString() {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");
        return "Início: " + sdf.format(startCalendar.getTime()) + " Término: " 
                + sdf.format(endCalendar.getTime());
    }
}
